import tensorflow as tf

#加载slim库
slim=tf.contrib.slim

#slim.arg_scop()函数可以用于设置默认的参数取值。
# 其第一个参数是一个函数列表，在这个列表中的函数将使用默认的参数取值，在调用这些函数时也可以赋新值来覆盖默认值。
# 比如通过下面的定义，调用slim.conv2s(net,320,[1,1])函数时会自动加上stride=1和padding="SAME"的参数。
# 如果在函数调用时显式指定了stride，那么这里设置的默认值将不再使用。
# 通过上述这种方式可以进一步减少代码冗余。
with slim.arg_scope(
    [slim.conv2d,slim.max_pool2d,slim.avg_pool2d],stride=1,padding="VALID"):
    #此处省略了Inception-v3模型中其他的网络结构而直接实现图6-17种后面方框种Inception模块，
    # 假设输入图片经过前面的结构得到的输出保存在变量net种
    net="上一层的输出结果矩阵"
    #为一个Inception模块声明一个统一的变量命名空间
    with tf.variable_scope('Mixed_7c'):
        #给Inception模块中每一条路径声明一个命名空间
        with tf.variable_scope('Branch_0'):
            #实现一个过滤器尺寸为1，深度为320的卷积层
            branch_0=slim.conv2d(net,320,[1,1],scope='Conv2d_0a_1x1')

        #Inceprion模块中第二条路径，该条路径本身就是一个Inception模块
        with tf.variable_scope('Branch_1'):
            branch_1=slim.conv2d(net,384,[1,1],scope='Conv2d_0a_1x1')
            #tf.concat()函数可以将多个矩阵拼接起来，第一个参数指定了拼接的维度axis，这里的3表示在深度这个维度上进行拼接
            branch_1=tf.concat(
                3,[
                    #看图6-17，这里的2层卷积层的输入都是branch_1而不是net
                    slim.conv2d(branch_1,384,[1,3],scope='Conv2d_0b_1x3'),
                    slim.conv2d(branch_1,384,[3,1],scope='Conv2d_0c_3x1')
                ]
            )

        #Inception模块中第三条路经，该条路径也是一个Inception模块
        with tf.variable_scope('Branch_2'):
            branch_2=slim.conv2d(net,448,[1,1],scope='Conv2d_0a_1x1')
            branch_2=slim.conv2d(branch_2,384,[3,3],scope='Conv2d_0b_3x3')
            branch_2=tf.concat(
                3,[
                    slim.conv2d(branch_2,384,[1,3],scope='Conv2d_0c_1x3'),
                    slim.conv2d(branch_2,384,[3,1],scope='Conv2d_0d_3x1')
                ]
            )

        #Inception模块中第四条路径
        with tf.variable_scope('Branch_3'):
            branch_3=slim.avg_pool2d(net,[3,3],scope='AvgPool_0a_3x3')
            branch_3=slim.conv2d(branch_3,193,[1,1],scope='Conv2d_0b_1x1')

        #当前Inception模块的最后输出是上面四条路经计算结果拼接得到的
        net=tf.concat(
            3,[branch_0,branch_1,branch_2,branch_3]
        )

